今天我們回到 API 設計的部分,來聊聊 Restful 成熟度模型以及 level 3 的 HATEOAS 是如何運作的~
Richardson Maturity Model是由 Martin Fowler 提出的,用來衡量一隻API 的 RESTfulness 程度。這個模型將 REST API 的成熟度分為四個不同的級別,從 Level 0 到 Level 3,每個級別表示該 API 更接近 REST。
在 HATEOAS 的設計中,當客戶端向 server 發送請求後,server 的回應不僅會包含請求的資源,還會包含和資源相關的操作連結(hypermedia links),這些連結會描述了接下來可以執行的操作。
e.g. :
-在獲取某客戶端資料後,API 回應中可能會附帶一個連結,告訴使用者如何更新或刪除該用戶。
HATEOAS 的設計除了使 API 減少了客戶端對 API 文件的依賴,也同時提高了系統的可擴展性和靈活性。
HATEOAS 的優點
{
"id": 001,
"name": "TV",
"links": [
{ "rel": "self", "href": "/orders/001" },
{ "rel": "update", "href": "/orders/001/update" },
{ "rel": "delete", "href": "/orders/001/delete" }
]
}
在這個回應中,除了該筆訂單外,你還能看到一些相關操作的連結(如更新或刪除這個訂單的資源)。
最後,我們簡單用 FASTAPI 來實作一個 HATEOAS 吧!
from fastapi import FastAPI
from pydantic import BaseModel
from typing import List
import uvicorn
app = FastAPI()
class User(BaseModel):
id: int
name: str
links: List[dict]
@app.get("/orders/{order_id}", response_model=User)
async def get_order(order_id: int):
user_data = {
"id": order_id,
"name": "Yusinz",
"links": [
{"rel": "self", "href": f"/orders/{order_id}"},
{"rel": "update", "href": f"/orders/{order_id}/update"},
{"rel": "delete", "href": f"/orders/{order_id}/delete"}
]
}
return user_data
if __name__ == "__main__":
uvicorn.run(app, host="127.0.0.1", port=8000)
完成後就可以 call API 看到它的呈現方式囉!